package cn.tedu.antcolony.passport.service;


import cn.tedu.antcolony.passport.pojo.dto.AdminLoginInfoDTO;
import cn.tedu.antcolony.passport.pojo.param.AdminAddNewParam;
import cn.tedu.antcolony.passport.pojo.param.AdminLoginParam;
import cn.tedu.antcolony.passport.pojo.param.AdminUpdatePassword;
import cn.tedu.antcolony.passport.pojo.param.UpdateAdminParam;
import cn.tedu.antcolony.passport.pojo.vo.AdminListItemVO;
import cn.tedu.antcolony.passport.pojo.vo.AdminStandardVO;
import cn.tedu.antcolonycommons.pojo.vo.PageData;
import com.fasterxml.jackson.core.JsonProcessingException;

/**
 * 管理员接口
 */

/**
 * @全体成员 各位同学，成老师因为身体不适，明天（周一）请假一天。
 *
 * 请将以下内容作为明天的练习安排同学们完成：
 * 1. 查询管理员列表，在Service层实现分页
 * 2. 根据ID删除管理员，在Service层需同步删除对应的“管理员与角色的关联”数据
 * 3. 补全添加管理员的业务：在Service层自动装配PasswordEncoder，插入管理员数据之前，取出原密码，执行加密，将密文存入到Amin对象再插入
 * 4. 根据ID修改管理员密码，此功能用于最高权限的管理员修改其他账号密码，在Service层无需验证原密码，直接写入新密码对应的密文即可，但需要验证账号是否存在
 * 5. 修改管理员的基本信息，此功能用于最高权限的管理员修改其他账号信息，需验证账号是否存在、新手机号码和新邮箱不可以与其他账号的冲突
 * 以上功能只需要完成Mapper与Service层，最终通过Service层的测试进行检验
 * 如果同学们完成以上内容仍有剩余时间，可用于开发项目峰会的项目
 */
public interface IAdminService {
    /**
     * 添加管理员
     * @param adminAddNewParam
     */
    void addNew(AdminAddNewParam adminAddNewParam);

    /**
     * 修改密码
     * @param adminUpdatePassword
     */
    void updatePassword(AdminUpdatePassword adminUpdatePassword,Long id);

    /**
     * 查询管理员列表
     * @param pageNum 当前页码数
     * @param pageSize 每页查询条数
     * @return
     */
    PageData<AdminListItemVO> adminList(Integer pageNum, Integer pageSize);

    PageData<AdminListItemVO> adminList(Integer pageNum);


    //TODO根据id删除管理员
    void deleteAdminById(Long id);

    /**
     * 管理员登录
     * @param adminLoginParam 登录 用户名 密码
     * @param remoteAddr 登录ip地址
     * @param userAgent  客户登录端浏览器
     * @return
     * @throws JsonProcessingException
     */
    AdminLoginInfoDTO adminLogin(AdminLoginParam adminLoginParam, String remoteAddr, String userAgent) throws JsonProcessingException;

    /**
     * 管理员退出登录
     */
    void adminLogOut(String jwt);

    /**
     * 修改管理员基本信息类
     * @param updateAdminParam
     */
    void updateAdmin(UpdateAdminParam updateAdminParam,Long id);

    AdminStandardVO getAdminById(Long id);
}
